#ifndef _MSGQUEUE_H_
#define _MSGQUEUE_H_
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include "user.h"
#include "contact.h"

#define SERVER 8080

typedef struct
{
    long type;
    int handle;					//用户请求的操作(增、删、改、查)
    ArgVal argVal;				//传递的参数
}ServerRcvMsg,ClientSendMsg;

typedef struct
{
    long type;
    int result;						//-1失败 0 完成 1 后续还有未传完
    ResultVal resultVal;			//返回结果
}ServerSendMsg,ClientRcvMsg;

enum
{
    GETCONTACTLIST, 
    ADDCONTACT,
    LOGIN, 
    REGISTER, 
    LOGOUT, 
    DESTROY,
    DELETECONTACT,
    CHANGECONTACT,
    CLEARCONTACT
};

/*
    参数：
        srm 接收消息体的地址
    功能：接收消息队列
    返回值：
        接收成功 0 失败 -1;
*/
int Recive(ServerRcvMsg *srm);

/*
    参数：
        messageId 消息队列id的地址
    功能：删除消息队列
*/
void ClearMsgQ();

/*
    参数：
        messageId 消息队列id的地址
    功能：创建消息队列
    返回值：
        创建成功 0 失败 -1;
*/
int CreateMsgQ();

/*
    参数： pUser 用户信息 pContactList联系人列表空间地址
    功能：  向进程B获取用户的联系人列表
*/
void RequsetGetContactList(PUserType pUser, PSeqListType pContactList);

/*
    参数： 联系人列表空间地址
    功能：  响应进程A用户的获取联系人列表请求
*/
void ResponseGetContactList(long type , PSeqListType pContactList);

//添加联系人
//-1 程序异常
// 0  添加成功
int RequestAddContact(PElementType pData);

/*
    参数： 结果
    功能： 响应进程A添加联系人请求
*/
void ResponseAddContact(long userId,  int result);

/*
    参数：
        pUser 用户信息空间地址
    功能：访问登录
    返回值：
        0  登录成功
        -1 程序异常
        1  用户不存在
        2  重复登录
        3  密码不正确
*/
int RequestLogin(PUserType pUser);

/*
    参数：
        pUser 用户信息空间地址
        result
            0  登录成功
            -1 程序异常
            1  用户不存在
            2  重复登录
            3  密码不正确
    功能：响应访问登录
*/
void ResponseLogin(long userId, int result, PUserType pUser);

/*
    参数：
        pUser 用户信息空间地址
    功能：访问注册
    返回值：
        0  注册成功
        -1 程序异常
        1  用户存在 
        2  注册失败
*/
int RequestRegister(PUserType pUser);

/*
    参数：
        result： 
            0  注册成功
            -1 程序异常
            1  用户存在 
            2  注册失败
    功能：响应注册 
*/
void ResponseRegister(long userId,  int result);

//     参数： userId
//     功能：用户登出
//     返回值：成功 1， 失败 -1
int RequestLogout(PUserType pUser);

/*
    参数：
        userId
        result
            -1 失败
            1  成功
    功能：响应登出
*/
void ResponseLogout(long userId,  int result);

// -1 程序异常
// 1  注销成功
// 退出帐号
int RequestDestroy(PUserType pUser);

// -1 程序异常
// 1  注销成功
// 响应退出帐号
void ResponseDestroy(long userId,  int result);

// 1）发送删除联系人信息请求
//-1 程序异常
// 0  添加成功
int RequestDeleteContact(PContactType pContact);

// 1）响应删除联系人信息请求
// -1 程序异常
// 0  添加成功
void ResponseDeleteContact(long userId,  int result);

// 1）发送修改联系人信息请求	
//-1 程序异常
// 0  添加成功
int RequestChangeContact(PContactType pContact);

// 1）响应修改联系人信息请求	
//-1 程序异常
// 0  添加成功
void ResponseChangeContact(long userId,  int result);

/*
	功能：在通讯录中清空联系人
	参数：
        pUser           用户信息空间地址
	返回值：
        -1 程序异常
        0  清空成功
*/
int RequestClearContact(PUserType pUser);

/*
	功能：在通讯录中清空联系人
	参数：
        userId           用户ID
        result
            -1 程序异常
            0  清空成功
        
*/
void ResponseClearContact(long userId,  int result);
#endif